//
//  UIView+CQPopupBottomPanlineToolbarAction.m
//  AppCommonUICollect
//
//  Created by ciyouzen on 2019/8/13.
//  Copyright © 2019 dvlproad. All rights reserved.
//

#import "UIView+CQPopupBottomPanlineToolbarAction.h"
#import <Masonry/Masonry.h>
#import <CJPopupContainer/CQPopupInfo+Effect.h>
#import <CQPopupContainerAnimation/UIView+CJPopupFrameAnimation.h>


@implementation UIView (CQPopupBottomPanlineToolbarAction)


#pragma mark - 从底部弹出当前视图的相关代码

#pragma mark Event
/*
 *  将当前视图加上toolbar(没有确认按钮)后显示到window底部
 *
 *  @param popupSuperview                   弹出视图的父视图view(如果为nil，则会弹出到window上)
 *  @param selfHeight                       本视图被干净弹出的高度
            （即使本视图最终是由其他视图包着弹出,这里也只输入本视图被干净弹出的高度,实际最终的弹窗高度,内部会自动计算后以最终高度弹出)
 *  @param title                            弹出视图的上部toolbar中的title
 *  @param shouldAddPanAction               是否添加仿抖音评论的下拉拖动手势(附对于那些会弹出键盘的视图，一般设为NO，即不添加)
 */
- (void)cqPopup_bottom_with_panline_toolbarWithoutOK_showInView:(nullable UIView *)popupSuperview
                                withHeight:(CGFloat)selfHeight
                              toolbarTitle:(NSString *)title
                        shouldAddPanAction:(BOOL)shouldAddPanAction
{
    __weak typeof(self)weakSelf = self;
    CQPopupInfo *popupInfo = [CQPopupInfo addBottom_panline_toolbarWithoutOK_inView:popupSuperview
                                                                          clearView:self
                                                                    clearViewHeight:selfHeight
                                                                       toolbarTitle:title
                                                               shouldEnableTapBlank:YES
                                                                 shouldAddPanAction:shouldAddPanAction
                                                                    popupHideHandle:^{
        [weakSelf cqPopup_bottom_with_panline_toolbar_hide];
    }];
    
    // 修饰弹窗
    CQBottomPopupViewCornerRadiusFor cornerType = CQBottomPopupViewCornerRadiusForContentView;
    CQEffectFor effectType = CQEffectForBlankViewWithDark;
    CQBottomPopupViewBGTheme selfBGType = CQBottomPopupViewBGThemeNone;
    [CQPopupInfo configToolbarPopupInfo:popupInfo withCornerType:cornerType effectType:effectType selfBGType:selfBGType];
    
    // 弹出弹窗
    [self cj_popupWithViewInfo:popupInfo isToBottom:YES];
    
}

/*
 *  将当前视图加上toolbar(有确认按钮)后显示到window底部(可自定制点击空白区域会不会优先尝试执行确认操作，不行才执行取消操作的事件)
 *
 *  @param popupSuperview                   弹出视图的父视图view(如果为nil，则会弹出到window上)
 *  @param selfHeight                       本视图未加顶部下拉线和顶部工具栏时候的干净高度
            （即使本视图最终是由其他视图包着弹出,这里也只输入本视图被干净弹出的高度,实际最终的弹窗高度,内部会自动计算后以最终高度弹出)
 *  @param selfBGType                       背景类型
 *  @param effectType                   模糊类型
 *  @param title                            弹出视图的上部toolbar中的title
 *  @param okHandle                         确认事件(通过返回ok事件执行后所得结果及要对弹窗所做的动作来控制隐藏)
            （额外增加toolbarOKEnable参数，因为该确认事件除含toolbar的确认外，还可能要求点击空白区域时候要优先尝试执行确认操作，不行才执行取消操作的事件）
 *  @param shouldAddPanAction               是否添加仿抖音评论的下拉拖动手势(附对于那些会弹出键盘的视图，一般设为NO，即不添加)
 *  @param tapBlankOrPandissmissFirstTryOK  点击空白区域/下拉会不会优先尝试执行确认操作，不行才执行取消操作(NO，则直接执行取消操作)
 */
- (void)cqPopup_bottom_with_panline_toolbarWithOK_showInView:(nullable UIView *)popupSuperview
                                  withHeight:(CGFloat)selfHeight
                                  selfBGType:(CQBottomPopupViewBGTheme)selfBGType
                                  effectType:(CQEffectFor)effectType
                                toolbarTitle:(NSString *)title
                                    oKHandle:(CQOKResult(^ _Nonnull)(BOOL toolbarOKEnable, CQOKOperation okOperation))okHandle
                          shouldAddPanAction:(BOOL)shouldAddPanAction
                          tapBlankFirstTryOK:(BOOL)tapBlankOrPandissmissFirstTryOK
{
    NSAssert(okHandle != nil, @"okHandle不能为空");
    
    __weak typeof(self)weakSelf = self;
    CQPopupInfo *popupInfo = [CQPopupInfo addBottom_panline_toolbarWithOK_inView:popupSuperview
                                                                       clearView:self
                                                                 clearViewHeight:selfHeight
                                                                    toolbarTitle:title
                                                                        oKHandle:okHandle
                                                            shouldEnableTapBlank:YES
                                                              shouldAddPanAction:shouldAddPanAction
                                                              tapBlankFirstTryOK:tapBlankOrPandissmissFirstTryOK
                                                                 popupHideHandle:^{
        [weakSelf cqPopup_bottom_with_panline_toolbar_hide];
    }];
    
    // 修饰弹窗
    CQBottomPopupViewCornerRadiusFor cornerType = CQBottomPopupViewCornerRadiusForContentView;
    [CQPopupInfo configToolbarPopupInfo:popupInfo withCornerType:cornerType effectType:effectType selfBGType:selfBGType];
    
    // 弹出弹窗
    [self cj_popupWithViewInfo:popupInfo isToBottom:YES];
}




/*
 *  从window底部隐藏当前视图
 */
- (void)cqPopup_bottom_with_panline_toolbar_hide {
    [self cj_hidePopupView];
    
}


#pragma mark - Update(比较少用)
// 最后的实际弹窗（目前的使用场景：弹出的视图中包含文本框，需要通过此属性来注册通知）
- (UIView *)cqToolbar_realPopupView {
    UIView *realPopupView = self.cjPopupInfo.popupView;
    return realPopupView;
}

- (CQPopupBottomToolbarContentView *)getToolbarContentView {
    CQPopupInfo *popupInfo = (CQPopupInfo *)self.cjPopupInfo;
    return popupInfo.viewWithoutPanLine;
}

/// 更新视图的工具栏上的标题（常见场景：①输入文字时候，显示剩余几个字；②地点选择时候，实时更新对应的地点文本）
- (void)cqCustom_toolbar_updateToobarTitle:(NSString *)toolbarTitle {
    CQPopupTopView *toolbar = [self getToolbarContentView].toolbar;
    toolbar.title = toolbarTitle;
}

/// 更新视图的工具栏上的确认标题（默认是"完成"，需要更新的话，要调用此方法）
- (void)cqCustom_toolbar_updateToobarOKTitle:(NSString *)toolbarOKTitle {
    CQPopupTopView *toolbar = [self getToolbarContentView].toolbar;
    [toolbar.okButton setTitle:toolbarOKTitle forState:UIControlStateNormal];
}

/// 更新视图的工具栏上的“完成”按钮的enable
- (void)cqCustom_toolbar_updateToobarOKEnable:(BOOL)toolbarOKEnable {
    CQPopupTopView *toolbar = [self getToolbarContentView].toolbar;
    toolbar.okButton.enabled = toolbarOKEnable;
}


/*
 *  更新popupView视图的高度，内部会同时更新realPopupView的高度（常使用带有输入文本框的弹出视图，随着输入内容的长度变化，高度会变化）
 *  @brief: 此方法的调用者为除toolbar外的那个popupView(非realPopupView)
 *
 *  @param selfHeight                   本视图未加顶部下拉线和顶部工具栏时候的干净高度
 （即使本视图最终是由其他视图包着弹出,这里也只输入本视图被干净弹出的高度,实际最终的弹窗高度,内部会自动计算后以最终高度弹出)
 */
- (void)cqCustom_toolbar_updatePopupContentHeight:(CGFloat)selfHeight {
    UIView *realPopupView = [self cqToolbar_realPopupView];
    
    CQPopupInfo *popupInfo = (CQPopupInfo *)self.cjPopupInfo;
    CGFloat panLineAndSapcingHeight = popupInfo.panLineAndSapcingHeight;
    CGFloat viewHeightWithoutPanLine = [CQPopupBottomToolbarContentView contentViewHeightWithCustomViewHeight:selfHeight]; // 除去顶部下拉线之外的其他视图的高度
    CGFloat realPopupViewHeight = panLineAndSapcingHeight + viewHeightWithoutPanLine;
    [UIView cqCustom_toolbar_updateRealPopupView:realPopupView realPopupViewHeight:realPopupViewHeight];
    
    
    // TODO:为什么已经是主线程，还必须放主线程才会更新到
    dispatch_async(dispatch_get_main_queue(), ^{
        [self mas_updateConstraints:^(MASConstraintMaker *make) {
            make.height.equalTo(@(selfHeight));
        }];
    });
}

/*
 *  更新视图的高度（常使用带有输入文本框的弹出视图，随着输入内容的长度变化，高度会变化）
 *
 *  @param selfHeight                   本视图被干净弹出的高度
 （即使本视图最终是由其他视图包着弹出,这里也只输入本视图被干净弹出的高度,实际最终的弹窗高度,内部会自动计算后以最终高度弹出)
 */
+ (void)cqCustom_toolbar_updateRealPopupView:(UIView *)realPopupView realPopupViewHeight:(CGFloat)realPopupViewHeight {
    CGFloat oldMaxY = CGRectGetMaxY(realPopupView.frame);

    CGRect oldFrame = realPopupView.frame;
    oldFrame.size.height = realPopupViewHeight;
    oldFrame.origin.y = oldMaxY-realPopupViewHeight; // 记得操作此步，上移y
    realPopupView.frame = oldFrame;
}

@end
